【解决】秘钥硬编码安全问题

您所在的位置:网站首页 intel h265 硬解库 【解决】秘钥硬编码安全问题

【解决】秘钥硬编码安全问题

2023-07-01 10:19| 来源: 网络整理| 查看: 265

导读 程序中经常用到需要用对称加密算法加解密,通常的做法是在代码中写死,硬编码到代码里。但是通过工具分析代码,是可以看到编码信息的,所以安全的做法是做一次变换,再硬编码进去。

秘钥硬编码是常见的安全问题。攻击者拿到编译后的包后,经过分析是可以拿到所有使用到的字符串的(可以使用ida),很容易泄露对称秘钥,导致安全问题。(非对称算法的公钥是可以公开的)

最安全的解决方案是:对称秘钥按照会话随机生成。通过非对称的(比如RSA)算法,两边交换秘钥。

不过大部分场景还是需要把秘钥写在程序中的,对称秘钥如何存储一直是安全的大难题,目前没有什么方案可以保证安全存储对称秘钥的方案,相关的方案只是增加了破解难度而已。

相对安全的方案是:对秘钥进行变换。

使用的数学方法有:

移位和循环移位   移位就是将一段数码按照规定的位数整体性地左移或右移。循环右移就是当右移时,把数码的最后的位移到数码的最前头,循环左移正相反。例如,对十进制数码12345678循环右移1位(十进制位)的结果为81234567,而循环左移1位的结果则为23456781。

置换   就是将数码中的某一位的值根据置换表的规定,用另一位代替。它不像移位操作那样整齐有序,看上去杂乱无章。这正是加密所需,被经常应用。

扩展   就是将一段数码扩展成比原来位数更长的数码。扩展方法有多种,例如,可以用置换的方法,以扩展置换表来规定扩展后的数码每一位的替代值。

压缩   就是将一段数码压缩成比原来位数更短的数码。压缩方法有多种,例如,也可以用置换的方法,以表来规定压缩后的数码每一位的替代值。

异或   这是一种二进制布尔代数运算。异或的数学符号为⊕ ,它的运算法则如下: 1⊕1 = 0 0⊕0 = 0 1⊕0 = 1 0⊕1 = 1   也可以简单地理解为,参与异或运算的两数位如相等,则结果为0,不等则为1。

迭代   迭代就是多次重复相同的运算,这在密码算法中经常使用,以使得形成的密文更加难以破解。

通常是对秘钥进行变形,然后程序里面提供相关接口在运算过程中获取真实的秘钥。下面是几种常见的简单方案:

方案1:使用RSA加密保存

方案很简单,使用RSA的私钥进行加密,RSA的公钥写死在客户端里,使用的时候使用RSA进行一次解密操作。

优点: 简单容易实现,一般项目里都需要使用非对称的加密方法,利用公开的秘钥做一次解密。 缺点: 如果知道了算法很容易破解。

方案2:使用Base64进行编码,再保存

对秘钥进行Base64编码,然后再解码。

方案3:使用AES再次加密

再使用一次对称加密,两次不要使用相同的秘钥

方案4:自定义方案

下面给一个方案,对数据进行变形。算法如下:

对每一个字节做一次循环右移

对每一个字节用一个表的数据做位异或操作

转为16进制数

推荐方案5: 随机+固定

本地固定使用一段随机数16字节,使用上面的方法或自定义方法做一层变换后再存储。

启动后随机生成16字节的数据,持久化到本地(可以保存到keychain里)。后面如果有保存就直接使用。

两个做拼接后生成32字节作为对称秘钥。

好处:

秘钥是每个设备随机生成的,所以拿到固定秘钥和算法不会影响其他设备。

两段进行拼接加大了相关破解的难度

缺点:

首次读取持久化的秘钥有一定耗时

能破解一定能破解

最后

目前没有安全的方法保存秘钥,除非使用硬件来解决(后台的加密机使用的就是硬件,秘钥放在芯片里),所以本地保存数据需要遵循:

需要长久更安全的保存,使用keychain的方式保存

不要保存敏感信息,如果要保存需要先做脱敏

任何时候都不要保存密码



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3